package collection;

import java.util.HashSet;

/**
 * Created with IntelliJ IDEA
 * Description:HashSet学习
 * User:22954
 * Date:2024-02-08
 * Time:3:29
 */
@SuppressWarnings("all")
public class HashSet_ {
    /*
      HashSet实现了Set接口
      HashSet实例化实际上是HashMap
      无论泛型定义是什么，都可以存null值
      有哈希表的基本性质，不能有重复值，存储和取出顺序不一致
    */
    public static void main(String[] args) {
        /*
          观察
          1.map中table中的一条链表长度到达8，优先扩容table直至table容量为64
          2.满足一条链表长度为8且table容量为64，再次添加至该链表时，会将该链表转换为红黑树
         */
        HashSet<Cat> cats = new HashSet<>();
        for (int i = 0; i < 12; i++) {
            cats.add(new Cat(""+i));
        }
    }
    public static void main3(String[] args) {
        /*
          观察map中的table是否在达到0.75时扩容table
         */
        HashSet<Integer> integers = new HashSet<>();
        for (int i = 0; i < 25; i++) {
            integers.add(i);
        }
    }
    public static void main2(String[] args) {
        /*
          字符串第一次已经存入常量池
          第二次直接指向常量池，指向的是同一对象
         */
        HashSet<String> strings = new HashSet<>();
        System.out.println(strings.add("hello"));//true
        System.out.println(strings.add("hello"));//false
        System.out.println(strings.toString());//[hello]
        System.out.println("===========");
        /*
          创建新对象时，指向的是两个不同对象，即使成员变量名相同也是两个对象，可以同时存在HashSet中
         */
        HashSet<Cat> cats = new HashSet<>();
        System.out.println(cats.add(new Cat("Tom")));//true
        System.out.println(cats.add(new Cat("Tom")));//true
        System.out.println(cats.toString());//[Cat{name='Tom'}, Cat{name='Tom'}]
        System.out.println("==============");
        /*
          HashSet中的add()调用HashMap中是put(),put()调用putVal()
          putVal()中，当Hash值相同时，会用{key != null && key.equals(k)}判断key值是否相同
          String中的HashCode()被重写，实际根据value值生成哈希值
          String中的equal()被重写，实际判断String中value值是否相同
         */
        HashSet<String> strings1 = new HashSet<>();
        System.out.println(strings1.add(new String("abc")));//true
        System.out.println(strings1.add(new String("abc")));//false
        System.out.println(strings1.toString());//[abc]

    }
    public static void main1(String[] args) {
        HashSet<Integer> hashSet=new HashSet<>();
        System.out.println(hashSet.add(1));//true
        System.out.println(hashSet.add(2));//true
        System.out.println(hashSet.add(3));//true
        System.out.println(hashSet.add(1));//false
        System.out.println(hashSet.add(4));//true
        System.out.println(hashSet.add(5));//true
        System.out.println(hashSet.add(null));//true
        System.out.println(hashSet.remove(1));//true
        System.out.println(hashSet.remove(6));//false
        System.out.println(hashSet.toString());//[2, 3, 4, 5]
    }
}
@SuppressWarnings("all")
class Cat{
    private String name;

    public Cat(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                '}';
    }

    @Override
    public int hashCode() {
        return 0;
    }
}